from django.shortcuts import render

# Create your views here.
"""
# 1. **获取code**，
# 2. **通过code换取access_token**，
# 3. **再通过access_token换取openid**
"""
from django.views import View
from django.http import JsonResponse, HttpResponse
from QQLoginTool.QQtool import OAuthQQ


class QQUserView(View):
    def get(self, request):
        # 1. 获取code
        code = request.GET.get('code')
        if code is None:
            return JsonResponse({'code': 400, 'errmsg': '没有code参数'})
        # client_id=None,  我们在创建应用的时候的 id
        # client_secret=None,   我们在创建应用的时候的 秘钥
        # redirect_uri=None,  当我们用户扫描同意之后,跳转的页面的url
        # state=None
        QQ_CLIENT_ID = '101474184'
        # 我们申请的 客户端秘钥
        QQ_CLIENT_SECRET = 'c6ce949e04e12ecc909ae6a8b09b637c'
        # 我们申请时添加的: 登录成功后回调的路径
        QQ_REDIRECT_URI = 'http://www.meiduo.site:8080/oauth_callback.html'
        qq = OAuthQQ(client_id=QQ_CLIENT_ID,
                     client_secret=QQ_CLIENT_SECRET,
                     redirect_uri=QQ_REDIRECT_URI)

        # Todo 这儿参数是code不是qq,是用code获取token
        access_token = qq.get_access_token(code)
        openid = qq.get_open_id(access_token)

        from apps.oauth.models import OAuthQQUser
        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 对openid进行加密
            from apps.oauth.common import generic_openid
            secret_data = generic_openid(openid)
            return JsonResponse({'code': 1, 'access_token': secret_data})
        else:
            # 如果 存在 在进行自动登录(状态保持)操作
            # ① 状态保持
            from django.contrib.auth import login
            # login 的第二个参数 应该是 User 模型的实例对象
            # qquser.属性
            # OAuthQQUser 有 user 的属性
            login(request, qquser.user)
            response = JsonResponse({'code': 0, 'errmsg': 'ok'})

            response.set_cookie('username', qquser.user.username, max_age=14 * 24 * 3600)

            return response

    def post(self, request):
        import json
        # 1. 接收参数  --JSON
        data = json.loads(request.body.decode())
        # 2. 提取参数
        mobile = data.get('mobile')
        password = data.get('password')
        sms_code = data.get('sms_code')
        secret_data = data.get('access_token')

        # 解密
        from apps.oauth.common import check_token
        openid = check_token(secret_data)

        # 3. 验证参数
        if openid is None:
            return JsonResponse({'code': 400, 'errmsg': '参数错误'})
        import re

        if not re.match('1[3-9]\d{9}',mobile):
            return JsonResponse({'code':400,'errmsg':'手机号格式不正确'})

        # 3.1 链接redis
        from django_redis import get_redis_connection
        redis_cli = get_redis_connection('code')
        redis_sms_code = redis_cli.get(mobile)

        if redis_sms_code is None:
            return JsonResponse({'code': 400, 'errmsg': '短信验证码过期'})

        if redis_sms_code.decode() != sms_code:
            return JsonResponse({'code': 400, 'errmsg': '短信验证码错误'})

        # 4. 根据手机号判断用户信息判断是否注册
        from apps.users.models import User
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            user = User.objects.create(
                username=mobile,
                mobile=mobile,
                password=password
            )
        else:
            # 如果注册判断密码是否正确，不正确返回code400
            if not user.check_password(password):
                return JsonResponse({'code': 400, 'errmsg': '手机号或密码错误'})

        # 5. 绑定openid和用户信息{数据入库}
        from apps.oauth.models import OAuthQQUser
        OAuthQQUser.objects.create(
            user=user,
            openid=openid,
        )
        # 6.状态保持
        from django.contrib.auth import login

        login(request, user)

        # 7.返回响应
        response = JsonResponse({'code': 0, 'errmsg': 'ok'})
        response.set_cookie('username', user.username, max_age=14 * 24 * 3600)

        return response


"""
需求：
        让ＱＱ登录用户的openid和 用户信息绑定

前端：
        当用户输入完 手机号,密码,图片验证码,短信验证码之后,会点击绑定按钮
        前端要收集  openid,手机号,密码和短信验证码.发送给后端

后端：

    请求                  POST            body  openid,手机号,密码和短信验证码.发送给后端 JSOn

    业务逻辑
                    1.接收请求参数
                    2. 获取请求参数
                    3. 验证参数 -- 验证手机号,验证密码,验证短信验证码
                    4. 根据用户的手机号来查询判断 该手机号是否已经注册了用户
                        如果注册了需要验证密码
                        如果没有注册则需要新建用户
                    5. 绑定openid和用户信息[数据入库]
                    6. 设置状态保持
                    7. 返回响应
    响应
                    JSON        code:0
"""
